import request from "@/utils/request";

export function addDialogue(title, createUserId) {
    return request({
        url: '/front/culture/AITool/dialogue',
        method: 'POST',
        data: {
            title,
            createUserId
        }
    })
}

export function getDialogueById(userId, dialogueTitle) {
    return request({
        url: `/front/culture/AITool/dialogue/${userId}/${dialogueTitle}`,
        method: 'GET'
    })
}

export function getChatMessage(dialogueId) {
    return request({
        url: `/front/culture/AITool/ChatMessage/${dialogueId}`,
        method: 'GET'
    })
}

export function deleteDialogue(dialogueId) {
    return request({
        url: `/front/culture/AITool/dialogue/${dialogueId}`,
        method: 'DELETE'
    })
}

export function addChatMessage(data) {
    let user = JSON.parse(localStorage.getItem('xm-user')) || {}
    //在 chat 函数中使用 fetch 主要是为了处理流式数据，而 getMessages 函数使用 axios 则是因为它更适合处理简单的 GET 请求。
    return fetch(process.env.VUE_APP_BASEURL + '/front/culture/AITool/ChatMessage', {
        method: 'POST',
        // 需要手动指定请求体为application/json
        //给请求头加上token属性
        headers: {
            'Content-Type': 'application/json',
            'token': user.token
        },
        // 将 JavaScript 对象 userMessage 转换为 JSON 格式的字符串。
        body: JSON.stringify(data)
        // 第一个then处理网络响应的状态和初步解析
    }).then(response => {
        //注册成功回调
        // 如果响应状态码不在200-299范围内，抛出错误
        if (!response.ok) {
            throw new Error('网络响应不正常');
        }

        // 否则返回响应体
        return response.body;
        // 第二个then处理响应体(stream)
    }).then(body => {
        // 注册成功回调
        // 获取响应体中的读取器对象，用于逐块读取响应体流。
        const reader = body.getReader();
        // 创建一个 UTF-8 解码器，用于将二进制数据转换为文本。
        const decoder = new TextDecoder('utf-8');

        // read 函数用于从响应体流中读取数据并解码。
        function read() {
            // 调用响应体中读取器的read()方法读取流中的数据
            // read()返回Promise对象因为只有Promise对象才能通过.then()方法来处理异步操作的结果
            // 当响应体流中的数据可用时，Promise会解析为一个对象{done,value}
            // done:布尔值，当 done 为 true 时，表示所有数据都已经读取完毕；当 done 为 false 时，表示还有更多数据可以读取。
            // value:包含流中的数据块
            return reader.read().then(({done, value}) => {
                // 当流结束时表示没有更多的数据可以从流中读取了，将value设置为空字符串表示没有实际的数据
                if (done) {
                    console.log('Stream complete');
                    return {done, value: ''};
                }
                // 当流没结束时调用解码器将value解码为一个数据块，并设置流模式
                const chunk = decoder.decode(value, {stream: true});
                // 打印流中的数据块
                console.log('Received chunk:', chunk);
                // 返回 done:布尔值，是否完成;chunk:解码后的数据块
                return {done, value: chunk};
            });
        }

        // 返回一个对象该对象中包含一个名为read的属性，值为read函数的引用,允许逐块读取和处理流式数据。
        return {read};
    });
}


export function generatorImage({prompt, size, seed, createUser}) {
    return request({
        url: '/front/culture/Painting/generate',
        method: 'POST',
        data: {
            prompt,
            size,
            seed,
            createUser
        }
    })
}

export function imagList(params) {
    return request({
        url: '/front/culture/Painting/list',
        method: 'GET',
        params: params
    })
}

export function removeImage(imageUrl) {
    return request({
        url: '/front/culture/Painting/' + imageUrl,
        method: 'DELETE'
    })
}
